package main

import "fmt"

/** select语句
select 语句类似于 switch 语句，但是select会随机执行一个可运行的case。如果没有case可运行，它将阻塞，直到有case可运行。

select 是Go中的一个控制结构，类似于用于通信的switch语句。每个case必须是一个通信操作，要么是发送要么是接收。
select 随机执行一个可运行的case。如果没有case可运行，它将阻塞，直到有case可运行。一个默认的子句应该总是可运行的。
*/
func main() {
	//因为只能用在通信操作 所以这里需要使用chan(信道)

	//先定义chan
	var c1, c2, c3 chan int
	var i1, i2 int
	select {
	case i1 = <-c1:
		fmt.Println(i1)
	case c2 <- i2:
		fmt.Println(c2)
	case i3, ok := <-c3:
		if ok {
			fmt.Println(i3)
		} else {
			fmt.Println("fail")
		}
		//如果一个select下来都没有io操作那么就会执行default
	default:
		fmt.Println("no chan")
	}
	//如果没有default语句 又没有io操作select就会堵塞
	//①如果给出了default语句，那么就会执行default的流程，同时程序的执行会从select语句后的语句中恢复。
	//②如果没有default语句，那么select语句将被阻塞，直到至少有一个case可以进行下去。

}
